﻿///@author Rafał Hazan
///@email  rafal.hazan@gmail.com
#ifndef __MATRIX_GRAPH__
#define __MATRIX_GRAPH__

#include <iostream>
#include <sstream>
#include <vector>
#include <map>
#include <exception>
#include <cmath>
#include <queue>
#include <algorithm>
#include <stack>

/// Macierzowa reprezentacja grafu nieskierowanego.
class MatrixGraph
{
	friend std::ostream& operator<<(std::ostream & output, const MatrixGraph & p);

    public:
	/// Typ przechowywanych wartosci krawedzi w macierzy.
    typedef float V;
	/// Typ wiersza macierzy.
    typedef std::vector<V> vec_v;
    static const unsigned int MAX_NUMBER_VERT, MAX_NUMBER_EDGE, MAX_EDGE_WEIGHT;

    private:
    unsigned int _edgesQuantity;
    unsigned int _vertQuantity;
    ::std::vector<vec_v> _graphMatrix;

    public:
    MatrixGraph(unsigned int size = 0);
    virtual ~MatrixGraph() throw();

	/// Ustawia wage krawedzi miedzy wierzcholkami x i y.
	void setEdge(int x, int y, V val);
	/// @return liczba wierzcholkow grafu
	unsigned int getVSize() const;
	/// @return liczba krawedzi grafu
	unsigned int getESize() const;
	/// Sprawdza, czy wierzcholki v1 i v2 sa polaczane ze soba
	//@TODO Przeniesc to do algorytmow na grafach.
	bool areConnectedVerts(int v1, int v2) const;
	void print();


};

#endif